var express = require("express");
var router = express.Router();
var User = require("../../../../models/user.ts");
var _ = require("lodash");
var encrypt = require("../../enoadEncrypt");
var decrypt = require("../../enoadDecrypt");
var Role = require("../../../../models/RoleAccess.ts");
var Companys = require("../../../../models/Companys.ts");
var RoleAccess = require("../../../../models/RoleAccess.ts");

const Configs = require("../../../../models/ObjectConfig.ts"); //拿到总配置信息。

var uuid = require("uuid");

var systemFields = require("../../../../config/system_fields.json");
/**新用户注册接口
 * 入参{username,
      password,
      passwordRepeat,
      email}
 */
//@Api(name="/rest/user/reg")
router.post("/user/reg", (req, res) => {
  // 通过 req.query 获取客户端通过查询字符串，发送到服务器的数据
  const body = req.body;
  const companyId = body.companyId;
  var newUser = new User({
    name: body.name,
    tel: body.tel,
    password: body.password,
    email: body.email,
    role: body.role,
    department: body.department,
  });
  if (!companyId) {
    res.send({
      code: 202,
      msg: "参数不全，无法新增",
      data: null,
    });
  } else {
    Companys.findCompanyById(companyId, function (err, company) {
      if (err) {
        res.send({
          code: 201, // 0 表示处理成功，1 表示处理失败
          msg: "服务器错误，请联系管理员", // 状态的描述
          data: null, // 需要响应给客户端的数据
        });
      } else {
        RoleAccess.getAllData(
          company.companyCap + "_service",
          function (erry, objects) {
            if (err) {
              res.send({
                code: 201, // 0 表示处理成功，1 表示处理失败
                msg: "服务器错误，请联系管理员", // 状态的描述
                data: null, // 需要响应给客户端的数据
              });
            }
            //在这里增加一步，如果这个公司没有任何角色，增加系统管理员角色。
            //如果objects为空。长度为0.
            if (objects.length > 0) {
              //检查用户名是否已经存在
              User.get(
                newUser.name,
                company.companyCap + "_service",
                function (err, user) {
                  if (err) {
                    res.send({
                      code: 201, // 0 表示处理成功，1 表示处理失败
                      msg: "服务器错误，请联系管理员", // 状态的描述
                      data: null, // 需要响应给客户端的数据
                    });
                  } else {
                    if (user) {
                      res.send({
                        code: 201, // 0 表示处理成功，1 表示处理失败
                        msg: "用户名已被占用，请重新输入用户名", // 状态的描述
                        data: user, // 需要响应给客户端的数据
                      });
                    } else {
                      //如果不存在则新增用户
                      newUser.save(
                        company.companyCap + "_service",
                        function (err, user) {
                          if (err) {
                            res.send({
                              code: 201, // 0 表示处理成功，1 表示处理失败
                              msg: "服务器错误，请联系管理员", // 状态的描述
                              data: null, // 需要响应给客户端的数据
                            });
                          }
                          res.send({
                            code: 200, // 0 表示处理成功，1 表示处理失败
                            msg: "恭喜你，注册成功!", // 状态的描述
                            data: user, // 需要响应给客户端的数据
                          });
                        }
                      );
                    }
                  }
                }
              );
            } else {
              //没有，预置一个管理员，并预置两个实体 客户、任务
              let allPromise = getAllPromises(company.companyCap + "_service");
              Promise.all(allPromise).then((list) => {
                if (list && list.length > 0) {
                  let result = list[0]; //获取预置管理员角色信息
                  newUser.role = JSON.stringify({
                    id: result._id,
                    name: result.name,
                  });
                  //如果不存在则新增用户
                  newUser.save(
                    company.companyCap + "_service",
                    function (err, user) {
                      if (err) {
                        res.send({
                          code: 201, // 0 表示处理成功，1 表示处理失败
                          msg: "服务器错误，请联系管理员", // 状态的描述
                          data: null, // 需要响应给客户端的数据
                        });
                      }
                      res.send({
                        code: 200, // 0 表示处理成功，1 表示处理失败
                        msg: "恭喜你，注册成功!", // 状态的描述
                        data: user, // 需要响应给客户端的数据
                      });
                    }
                  );
                } else {
                  res.send({
                    code: 201,
                    msg: "服务器错误",
                    data: null,
                  });
                }
              });
            }
          }
        );
      }
    });
  }
});

//该方法用户预置角色信息、预置客户、任务两大配置实体
function getAllPromises(databaseName) {
  let allPromise = [];
  //预置管理员角色信息。
  allPromise.push(
    new Promise((resolve, reject) => {
      var role = new RoleAccess({
        name: "系统管理员",
        admin: true,
        access:
          '["system_config","title_cards","title_cards_create","title_cards_edit","title_cards_delete","title_cards_select"]',
      });
      role.save(databaseName, function (err, result) {
        if (err) {
          resolve(null);
        } else {
          resolve(result);
        }
      });
    })
  );
  //预置客户和任务实体
  let preConfig = [
    { name: "客户", belongId: 1, apiKey: "Account", state: "" },
    {
      name: "任务",
      belongId: 2,
      apiKey: "SystemTask",
      state:
        '[{"name":"任务状态","apiKey":"taskStatus","type":"simple_select","defaultValue":"","required":true,"display":true,"option":[{"id":1,"name":"未开始"},{"id":2,"name":"设计中"},{"id":3,"name":"编码中"},{"id":4,"name":"自测中"},{"id":5,"name":"测试中"},{"id":6,"name":"验收中"},{"id":7,"name":"完成"}],"fieldType":"5"},{"name":"任务描述","apiKey":"Describe","type":"string","defaultValue":"","required":true,"display":true,"fieldType":"1"},{"name":"任务等级","apiKey":"taskLevel","type":"simple_select","defaultValue":"","required":true,"display":true,"option":[{"id":1,"name":"建议"},{"id":2,"name":"低级"},{"id":3,"name":"中级"},{"id":4,"name":"重要"},{"id":5,"name":"严重"}],"fieldType":"5"}]',
    },
  ];
  _.forEach(preConfig, (config) => {
    allPromise.push(
      new Promise((resolve, reject) => {
        var busiType = JSON.stringify([
          {
            id: uuid.v4(),
            name: "默认业务类型",
          },
        ]);
        var objectConfig = new Configs(
          config.icon,
          config.name,
          config.apiKey,
          config.belongId,
          JSON.stringify(systemFields),
          config.state,
          busiType
        );
        objectConfig.save(databaseName, function (err) {
          if (err) {
            resolve(null);
          } else {
            resolve(objectConfig);
          }
        });
      })
    );
  });
  return allPromise;
}

//@Api(name="/rest/user/update")
router.post("/user/update", (req, res) => {
  let user = req.session.user;
  let dataBaseName = user.company.companyCap + "_service";
  const body = req.body;
  const id = body._id;
  var newUser = new User({
    name: body.name,
    tel: body.tel,
    password: body.password,
    email: body.email,
    role: body.role,
    department: body.department,
  });
  //检查用户名是否已经存在
  User.update(id, newUser, dataBaseName, function (err, user) {
    if (err) {
      res.send({
        code: 201, // 0 表示处理成功，1 表示处理失败
        msg: "服务器错误，请联系管理员", // 状态的描述
        data: null, // 需要响应给客户端的数据
      });
    } else {
      res.send({
        code: 200, // 0 表示处理成功，1 表示处理失败
        msg: "更新成功", // 状态的描述
        data: user, // 需要响应给客户端的数据
      });
    }
  });
});

//@Api(name="/rest/user/delete")
router.post("/user/delete", (req, res) => {
  let user = req.session.user;
  let dataBaseName = user.company.companyCap + "_service";
  const body = req.body;
  const ids = body.ids || []; //获取需要删除的id组。
  let allPromise = [];
  _.forEach(ids, (id) => {
    allPromise.push(
      new Promise((resolve, reject) => {
        User.deleteById(id, dataBaseName, (err) => {
          if (err) {
            resolve({ id, status: false });
          } else {
            resolve({ id, status: true });
          }
        });
      })
    );
  });
  Promise.all(allPromise).then((allStaus) => {
    let data = [];
    _.forEach(allStaus, (item) => {
      data.push({
        id: item.id,
        msg: item.status ? "删除成功" : "删除失败",
      });
    });
    res.send({
      code: 200, // 0 表示处理成功，1 表示处理失败
      msg: "操作完成", // 状态的描述
      data,
    });
  });
});

/**用户登录接口。
 * 入参{username,
      password,}
 */
//@Api(name="/rest/user/login")
router.post("/user/login", (req, res) => {
  const body = req.body;
  //首先查找所有公司，在每个公司下的数据库中查找对应账户和密码。如果该数据存在。则返回给客户。
  Companys.getAllCompanys(function (err, companys) {
    if (err) {
      res.send({
        code: 204,
        msg: "数据库异常，请联系管理员",
        data: null,
      });
    }
    if (companys) {
      let allPromise = [];
      _.forEach(companys, (company) => {
        //拿到所有公司，进行匹配用户名和密码。
        allPromise.push(
          new Promise((resolve, reject) => {
            User.get(
              body.username,
              company.companyCap + "_service",
              function (error, user) {
                if (!user) {
                  //这个数据库中该用户名不存在。
                  resolve({
                    code: 0,
                  });
                } else {
                  if (user.password != body.password) {
                    resolve({
                      code: 1,
                    });
                  } else {
                    user.company = company;
                    resolve({
                      code: 2,
                      data: user,
                    });
                  }
                }
              }
            );
          })
        );
      });
      Promise.all(allPromise).then((allCompanys) => {
        let data = [];
        let pwdError = [];
        _.forEach(allCompanys, (item) => {
          if (item.code === 2) {
            //有用户存在。
            data.push({
              ...item.data,
            });
          } else if (item.code === 1) {
            //密码错误
            pwdError.push(item);
          }
        });

        if (data.length > 0) {
          if (data.length === 1) {
            //只有一个公司，直接登录成功。
            let user = data[0];
            req.session.regenerate(function () {
              let roles = user.role;
              let company = user.company;
              if (roles) {
                roles = JSON.parse(roles);
                Role.findById(
                  roles.id,
                  company.companyCap + "_service",
                  function (error, result) {
                    if (error) {
                      res.send({
                        code: 201,
                        msg: "权限异常，请联系管理员",
                        data: null,
                      });
                    }
                    if (result && result.access) {
                      let permistions = JSON.parse(result.access); //得到access的数组。
                      user["permistions"] = permistions;
                    } else {
                      user["permistions"] = null;
                    }
                    //登录正常，在session中记录该用户。
                    req.session.user = user;
                    res.send({
                      code: 200,
                      msg: "登陆成功！",
                      data: user,
                    });
                  }
                );
              } else {
                user["permistions"] = null;
                //登录正常，在session中记录该用户。
                req.session.user = user;
                res.send({
                  code: 200,
                  msg: "登陆成功！",
                  data: user,
                });
              }
            });
          } else {
            res.send({
              code: 210,
              msg: "查询成功",
              data,
            });
          }
        } else if (pwdError.length > 0) {
          res.send({
            code: 201,
            msg: "密码错误",
            data: null,
          });
        } else {
          res.send({
            code: 201,
            msg: "用户不存在",
            data: null,
          });
        }
      });
    } else {
      res.send({
        code: 201,
        msg: "用户不存在",
        data: null,
      });
    }
  });
});

//@Api(name="/rest/user/login/company")
router.post("/user/login/company", (req, res) => {
  const body = req.body;
  const companyId = body.companyId;
  const userId = body.userId;
  if (!companyId || !userId) {
    res.send({
      code: 202,
      msg: "参数不全，无法新增",
      data: null,
    });
  }

  Companys.findCompanyById(companyId, function (err, company) {
    if (err) {
      res.send({
        code: 201,
        msg: "服务器错误，请联系管理员",
        data: null,
      });
    } else {
      //找到公司。然后找登录用户。
      User.findUserById(
        userId,
        company.companyCap + "_service",
        function (error, user) {
          if (err) {
            res.send({
              code: 201,
              msg: "服务器错误，请联系管理员",
              data: null,
            });
          } else {
            user.company = company;
            req.session.regenerate(function () {
              let roles = user.role;
              if (roles) {
                roles = JSON.parse(roles);
                Role.findById(
                  roles.id,
                  company.companyCap + "_service",
                  function (error, result) {
                    if (error) {
                      res.send({
                        code: 201,
                        msg: "权限异常，请联系管理员",
                        data: null,
                      });
                    }
                    if (result && result.access) {
                      let permistions = JSON.parse(result.access); //得到access的数组。
                      user["permistions"] = permistions;
                    } else {
                      user["permistions"] = null;
                    }
                    //登录正常，在session中记录该用户。
                    req.session.user = user;
                    res.send({
                      code: 200,
                      msg: "登陆成功！",
                      data: user,
                    });
                  }
                );
              } else {
                user["permistions"] = null;
                //登录正常，在session中记录该用户。
                req.session.user = user;
                res.send({
                  code: 200,
                  msg: "登陆成功！",
                  data: user,
                });
              }
            });
          }
        }
      );
    }
  });
});

// 用户登出接口。
//@Api(name="/rest/user/logout")
router.post("/user/logout", (req, res) => {
  // 通过 req.body 获取请求体中包含的 url-encoded 格式的数据
  req.session.cookie.maxAge = 0; /*改变cookie的过期时间*/
  //销毁
  req.session.destroy(function (err) {
    console.log(err);
  });
  req.session.user = null;
  // 调用 res.send() 方法，向客户端响应结果
  res.send({
    code: 200,
    msg: "登出成功",
    data: null,
  });
});

//获取用户所有数据。
//@Api(name="/rest/user/fetchAllUsers")
router.post("/user/fetchAllUsers", (req, res) => {
  let user = req.session.user;
  let dataBaseName = user.company.companyCap + "_service";
  User.getAllData(dataBaseName, (err, all) => {
    if (err) {
      res.send({
        code: 201,
        msg: "服务器错误，请联系管理员",
        data: null,
      });
    } else {
      _.forEach(all, (user) => {
        user.password = decrypt(user.password);
      });
      res.send({
        code: 200,
        msg: "查询成功",
        data: all,
      });
    }
  });
});
//获取当前的登录用户。
//@Api(name="/rest/user/fetchBySession")
router.post("/user/fetchBySession", (req, res) => {
  let user = req.session.user;
  res.send({
    code: 200,
    msg: "获取登录的用户",
    data: user,
  });
});

module.exports = router;
